#include "rclcpp/rclcpp.hpp"
#include "std_msgs/msg/string.hpp"
using namespace std::chrono_literals;//可以用数字后缀时间单位
class Talker: public rclcpp::Node
{
public:  
  Talker():Node("talker_node_cpp")
  {
    this->count=1;
    RCLCPP_INFO(this->get_logger(),"cpp发布节点");
    // 主题名称 话题名称
    // Qos消息队列长度  在 C++ 中，如果一个类提供了接受单个参数的构造函数，其实参数的作用是缓存 如果由于网络等原因
    // 并且该参数类型与传入值匹配，编译器可以自动进行隐式转换​
    // 第三个参数有一个默认值
    // return 发布对象(里面包含指针 也叫对象指针)
    publisher_ = this->create_publisher<std_msgs::msg::String>("chatter", 10);
    // 1s 100ms 创建定时器 1s每1s执行一次
    // 回调函数
    timer_ = this->create_wall_timer(1s, std::bind(&Talker::on_timer, this));
  }

private:
  rclcpp::Publisher<std_msgs::msg::String>::SharedPtr publisher_; //发布的消息类型
  rclcpp::TimerBase::SharedPtr timer_; // 定时指针
  size_t count;
  void on_timer()
  {
    auto message=std_msgs::msg::String();
    message.data = "hello world!"+std::to_string(count++);
    RCLCPP_INFO(this->get_logger(),"发布订阅消息： %s",message.data.c_str());
    publisher_->publish(message);
  }
};
int main(int argc, char ** argv)
{
  rclcpp::init(argc,argv);
  rclcpp::spin(std::make_shared<Talker>());
  rclcpp::shutdown();
  return 0;
}
